package openfl.events;

#if (display || !flash)
import openfl.net.URLRequestHeader;

@:jsRequire("openfl/events/HTTPStatusEvent", "default")

/**
 * The application dispatches HTTPStatusEvent objects when a network request
 * returns an HTTP status code.
 *
 * HTTPStatusEvent objects are always sent before error or completion
 * events. An HTTPStatusEvent object does not necessarily indicate an error
 * condition; it simply reflects the HTTP status code(if any) that is
 * provided by the networking stack. Some Flash Player environments may be
 * unable to detect HTTP status codes; a status code of 0 is always reported
 * in these cases.
 *
 * In Flash Player, there is only one type of HTTPStatus event:
 * `httpStatus`. In the AIR runtime, a FileReference, URLLoader, or
 * URLStream can register to listen for an `httpResponseStatus`,
 * which includes `responseURL` and `responseHeaders`
 * properties. These properties are undefined in a `httpStatus`
 * event.
 *
 */
extern class HTTPStatusEvent extends Event
{
	/**
	 * Unlike the `httpStatus` event, the
	 * `httpResponseStatus` event is delivered before any response
	 * data. Also, the `httpResponseStatus` event includes values for
	 * the `responseHeaders` and `responseURL` properties
	 * (which are undefined for an `httpStatus` event. Note that the
	 * `httpResponseStatus` event(if any) will be sent before(and in
	 * addition to) any `complete` or `error` event.
	 *
	 * The `HTTPStatusEvent.HTTP_RESPONSE_STATUS` constant defines
	 * the value of the `type` property of a
	 * `httpResponseStatus` event object.
	 *
	 * This event has the following properties:
	 */
	public static inline var HTTP_RESPONSE_STATUS = "httpResponseStatus";

	/**
	 * The `HTTPStatusEvent.HTTP_STATUS` constant defines the value of
	 * the `type` property of a `httpStatus` event object.
	 *
	 * This event has the following properties:
	 */
	public static inline var HTTP_STATUS = "httpStatus";

	public var redirected:Bool;

	/**
	 * The response headers that the response returned, as an array of
	 * URLRequestHeader objects.
	 */
	public var responseHeaders:Array<URLRequestHeader>;

	/**
	 * The URL that the response was returned from. In the case of redirects,
	 * this will be different from the request URL.
	 */
	public var responseURL:String;

	/**
	 * The HTTP status code returned by the server. For example, a value of 404
	 * indicates that the server has not found a match for the requested URI.
	 * HTTP status codes can be found in sections 10.4 and 10.5 of the HTTP
	 * specification at [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).
	 *
	 *
	 * If Flash Player or AIR cannot get a status code from the server, or if
	 * it cannot communicate with the server, the default value of 0 is passed to
	 * your code. A value of 0 can be generated in any player(for example, if a
	 * malformed URL is requested), and a value of 0 is always generated by the
	 * Flash Player plug-in when it is run in the following browsers, which do
	 * not pass HTTP status codes to the player: Netscape, Mozilla, Safari,
	 * Opera, and Internet Explorer for the Macintosh.
	 */
	public var status(default, null):Int;

	/**
	 * Creates an Event object that contains specific information about HTTP
	 * status events. Event objects are passed as parameters to event listeners.
	 *
	 * @param type       The type of the event. Event listeners can access this
	 *                   information through the inherited `type`
	 *                   property. There is only one type of HTTPStatus event:
	 *                   `HTTPStatusEvent.HTTP_STATUS`.
	 * @param bubbles    Determines whether the Event object participates in the
	 *                   bubbling stage of the event flow. Event listeners can
	 *                   access this information through the inherited
	 *                   `bubbles` property.
	 * @param cancelable Determines whether the Event object can be canceled.
	 *                   Event listeners can access this information through the
	 *                   inherited `cancelable` property.
	 * @param status     Numeric status. Event listeners can access this
	 *                   information through the `status` property.
	 */
	public function new(type:String, bubbles:Bool = false, cancelable:Bool = false, status:Int = 0, redirected:Bool = false):Void;
}
#else
typedef HTTPStatusEvent = flash.events.HTTPStatusEvent;
#end
